package objetos;

import java.io.FileNotFoundException;
import java.util.Collection;
import java.util.Date;
import java.util.LinkedList;

import android.content.Context;
import android.widget.Button;
import android.widget.DatePicker;
import android.widget.EditText;
import android.widget.Spinner;
import android.widget.Toast;
import android.widget.ToggleButton;
import ar.com.gastos.MainActivity;
import ar.com.gastos.Persistencia;
import ar.com.gastos.R;
import ar.com.gastos.ValoresPorDefecto;

public class MainObjc {

	final String ARCHIVO_CATEGORIAS = "comboCategoria.txt";
	final String ARCHIVO_INGRESOS = "ingresos.txt";
	final String ARCHIVO_GASTOS = "gastos.txt";

	private Spinner spC;
	private Spinner spS;

	private Button btnCategoria;
	private Button btnSubCategoria;
	private Button btnOk;
	private Button btnPrueba;
	private Button reset;

	private EditText descripcion;
	private EditText importe;

	private ToggleButton gastoIngreso;
	private ToggleButton tarjeta;
	private ToggleButton debito;

	private Persistencia persistencia = new Persistencia();

	private Context mainContext;

	private DatePicker fecha;

	private LinkedList<Categoria> llc = new LinkedList<Categoria>();
	private Collection<Ingreso> colIngreso;
	private Collection<Gasto> colGasto;

	private TipoGasto tipo;

	public MainObjc(MainActivity act) {


		colIngreso = new LinkedList<Ingreso>();
		colGasto = new LinkedList<Gasto>();
		
		

		btnPrueba = (Button) act.findViewById(R.id.btnPrueba);
		btnCategoria = (Button) act.findViewById(R.id.masCategoria);
		btnSubCategoria = (Button) act.findViewById(R.id.masSubCategoria);
		btnOk = (Button) act.findViewById(R.id.btnOk);
		reset = (Button) act.findViewById(R.id.reset);
		descripcion = (EditText) act.findViewById(R.id.descripcion);
		importe = (EditText) act.findViewById(R.id.importe);
		spS = (Spinner) act.findViewById(R.id.SpinnerSubCategoria);
		spC = (Spinner) act.findViewById(R.id.spinnerCategoria);
		gastoIngreso = (ToggleButton) act.findViewById(R.id.BtnGastoIngreso);
		tarjeta = (ToggleButton) act.findViewById(R.id.tarjetaEfectivo);
		debito = (ToggleButton) act.findViewById(R.id.debito);
		fecha = (DatePicker) act.findViewById(R.id.datePicker1);
		mainContext = act.getApplicationContext();

		colGasto = leerGastos();
		colIngreso = leerIngresos();

		cargarComboCategoria();
		// llc = (LinkedList<Categoria>) leerComboboxCategoria();
	}

	public Button getBtnReset() {

		return this.reset;

	}

	public void setOnDebito() {

		debito.setEnabled(true);

	}

	public void setOffDebito() {
		debito.setChecked(false);
		debito.setEnabled(false);

	}

	public ToggleButton getTarjeta() {

		return tarjeta;

	}

	public boolean esDebito() {

		return debito.isChecked();

	}

	// metodos mios
	public Double getImporte() {
		return Double.parseDouble(importe.getText().toString());
	}

	public void setImporte(Double dou) {

		this.importe.setText(dou.toString());

	}

	public boolean esIngreso() {

		return gastoIngreso.isChecked();

	}

	public boolean conTarjeta() {

		return tarjeta.isChecked();

	}

	public int getPosicionCategoria() {

		return spC.getSelectedItemPosition();

	}

	public int getPosicionSubCategoria() {

		return spS.getSelectedItemPosition();

	}

	private void cargarComboCategoria() {

		try {

			Collection<Object> readSettings = persistencia.ReadSettings(mainContext,
					ARCHIVO_CATEGORIAS);

			for (Object object : readSettings) {
				llc.add((Categoria) object);
			}

		} catch (FileNotFoundException e) {

			ValoresPorDefecto val = new ValoresPorDefecto();
			llc = (LinkedList<Categoria>) val.categoriasPorDefecto();

		} catch (Exception e) {

			ValoresPorDefecto val = new ValoresPorDefecto();
			llc = (LinkedList<Categoria>) val.categoriasPorDefecto();

		}

	}

	public void setTexto(String unTexto) {

		descripcion.setText(unTexto);

	}

	public void guardarCategorias() {

		Collection<Object> col = new LinkedList<Object>();

		for (Object object : llc) {

			col.add(object);

		}

		persistencia.WriteSettings(mainContext, col, ARCHIVO_CATEGORIAS);

	}

	public void agregarGasto(Gasto gas) {

		colGasto.add(gas);

	}

	public Collection<Ingreso> getColIngreso() {
		return colIngreso;
	}

	public void setColIngreso(Collection<Ingreso> colIngreso) {
		this.colIngreso = colIngreso;
	}

	public Collection<Gasto> getColGasto() {
		return colGasto;
	}

	public void setColGasto(Collection<Gasto> colGasto) {
		this.colGasto = colGasto;
	}

	public void agregarIngreso(Ingreso ing) {

		colIngreso.add(ing);

	}

	public void inicioOperacion() {

		// TODO
		boolean operacion;
		

		if (!importe.getText().toString().equals("0.0")){
		if (esIngreso()) {
			operacion = false;
			agregarIngreso(new Ingreso(this));
			guardarIngreso();
		} else {
			operacion = true;
			agregarGasto(new Gasto(this));
			guardarGasto();
		}
		}
		else{
			
			Toast.makeText(mainContext, "Debe completar El campo importe.", Toast.LENGTH_SHORT).show();
			
		}

	}

	private void guardarIngreso() {

		Collection<Object> col = new LinkedList<Object>();

		for (Ingreso ing : colIngreso) {
			col.add(ing);
		}

		persistencia.WriteSettings(mainContext, col, ARCHIVO_INGRESOS);

	}

	private void guardarGasto() {

		Collection<Object> col = new LinkedList<Object>();

		for (Gasto ing : colGasto) {
			col.add(ing);
		}

		persistencia.WriteSettings(mainContext, col, ARCHIVO_GASTOS);

	}

	public LinkedList<Gasto> leerGastos() {

		LinkedList<Gasto> llg = new LinkedList<Gasto>();
		
		
		try {
			 Collection<Object> readSettings = persistencia.ReadSettings(mainContext, ARCHIVO_GASTOS);
			 
			 for (Object object : readSettings) {
				
				 llg.add((Gasto)object);
				 
			}
			 return llg;
			 
		} catch (FileNotFoundException e) {

			e.printStackTrace();
			return new LinkedList<Gasto>();
		}catch(Exception e){
			
			return new LinkedList<Gasto>();
			
		}

	}

	public LinkedList<Ingreso> leerIngresos() {

		LinkedList<Ingreso> lli = new LinkedList<Ingreso>();
		
		
		try {
			 Collection<Object> readSettings = persistencia.ReadSettings(mainContext, ARCHIVO_INGRESOS);
			 
			 for (Object object : readSettings) {
				
				 lli.add((Ingreso) object);
				 
			}
			 return lli;
			 
		} catch (FileNotFoundException e) {

			e.printStackTrace();
			return new LinkedList<Ingreso>();
		}catch (Exception e){
			return new LinkedList<Ingreso>();
			
			
			
		}

	}

	public void crearGasto() {

	}

	public Date getFecha() {

		Date d = new Date();

		d.setDate(fecha.getDayOfMonth());
		d.setMonth(fecha.getMonth());
		d.setYear(fecha.getYear());

		return d;

	}

	public void setFecha(Date d) {

		// TODO

	}

	public Categoria getCategoria() {

		return llc.get(getPosicionCategoria());

	}

	public SubCategoria getSubCategoria() {

		return llc.get(getPosicionCategoria()).getSubca(
				getPosicionSubCategoria());

	}

	// GETTERS Y SETTERS (ELIMINAR ?)

	public Spinner getSpCategoria() {
		return spC;
	}

	public void setSpCategoria(Spinner spC) {
		this.spC = spC;
	}

	public Spinner getSpS() {
		return spS;
	}

	public void setSpS(Spinner spS) {
		this.spS = spS;
	}

	public LinkedList<Categoria> getLlc() {
		return llc;
	}

	public void setLlc(LinkedList<Categoria> llc) {
		this.llc = llc;
	}

	public Button getBtnCategoria() {
		return btnCategoria;
	}

	public Button getBtnPrueba() {

		return btnPrueba;

	}

	public void setBtnPrueba(Button btnPrueba) {

		this.btnPrueba = btnPrueba;

	}

	public void setBtnCategoria(Button btnCategoria) {
		this.btnCategoria = btnCategoria;
	}

	public Button getBtnSubCategoria() {
		return btnSubCategoria;
	}

	public void setBtnSubCategoria(Button btnSubCategoria) {
		this.btnSubCategoria = btnSubCategoria;
	}

	public Button getBtnOk() {
		return btnOk;
	}

	public void setBtnOk(Button btnOk) {
		this.btnOk = btnOk;
	}

	public String getDescripcion() {
		return descripcion.getText().toString();
	}

	public void setDescripcion(EditText descripcion) {
		this.descripcion = descripcion;
	}

	public ToggleButton getGastoIngreso() {
		return gastoIngreso;
	}

	public void setGastoIngreso(ToggleButton gastoIngreso) {
		this.gastoIngreso = gastoIngreso;
	}

	public void setImporte(EditText importe) {
		this.importe = importe;
	}

	public Context getMainContext() {
		return mainContext;

	}

	public void limpiar() {

		descripcion.setText("");

	}

	public void setOffTarjetaEfectivo() {
		tarjeta.setChecked(false);
	}

}
